#include <odb/database.hxx>
#include <odb/mysql/database.hxx>
#include <gflags/gflags.h>
#include <memory>
#include "student.hxx"
#include "student-odb.hxx"

DEFINE_string(host, "127.0.0.1", "这是Mysql服务器地址");
DEFINE_int32(port, 0, "这是Mysql服务器端口");
DEFINE_string(db, "TestDB", "数据库默认库名称");
DEFINE_string(user, "root", "这是Mysql用户名");
DEFINE_string(pswd, "123456", "这是Mysql密码");
DEFINE_string(cset, "utf8", "这是Mysql客户端字符集");
DEFINE_int32(max_pool, 3, "这是Mysql连接池最大连接数量");

// void insert_class(odb::database &db)
// {
//     try{
//         //获取事务对象开启事务
//         odb::transaction trans(db.begin());
//         //初始化数据
//          Classes c1("一年级一班");
//         Classes c2("一年级二班");
//         //插入数据
//         db.persist(c1);
//         db.persist(c2);
//         //提交事务
//         trans.commit();
//     }
//     catch(std::exception &e) {
//         std::cout << "插入失败: " << e.what() << std::endl;
//     }
// }
// void insert_student(odb::mysql::database &db)
// {
//     try {
//         //获取事务对象开启事务
//         odb::transaction trans(db.begin());
//         Student s1(1, "张三", 18, 1);
//         Student s2(2, "李四", 19, 1);
//         Student s3(3, "王五", 18, 1);
//         Student s4(4, "赵六", 15, 2);
//         Student s5(5, "刘七", 18, 2);
//         Student s6(6, "孙八", 23, 2);
//         db.persist(s1);
//         db.persist(s2);
//         db.persist(s3);
//         db.persist(s4);
//         db.persist(s5);
//         db.persist(s6);
//         //5. 提交事务
//         trans.commit();
//     }catch (std::exception &e) {
//         std::cout << "插入学生数据出错：" << e.what() << std::endl;
//     }
// }


Student select_student(odb::mysql::database &db)
{
    Student res;
    try {
        odb::transaction trans(db.begin());
        typedef odb::query<Student> query;
        typedef odb::result<Student> result;
        result ret(db.query<Student>(query::name == "张三"));
        if(ret.size() != 1){
            std::cout << "select error" << std::endl;
            return Student();
        }
        res = *ret.begin();
        trans.commit();
    }
    catch (std::exception &e) {
        std::cout << "更新学生数据出错：" << e.what() << std::endl;
    }
    return res;
}

int main(int argc, char *argv[])
{
    //初始化gflags
    google::ParseCommandLineFlags(&argc, &argv, true);
    //构建连接池工厂配置，必须使用unique_ptr
    std::unique_ptr<odb::mysql::connection_pool_factory> cpf(new 
    odb::mysql::connection_pool_factory(FLAGS_max_pool, 0));
    //构建库的操作对象,连接池必须使用右值引用
    odb::mysql::database db(FLAGS_user, FLAGS_pswd, FLAGS_db,
        FLAGS_host, FLAGS_port, "", FLAGS_cset,
        0, std::move(cpf));
    //数据操作
    //insert_student(db);
    //insert_class(db);

    return 0;
}
